问题模型:ES8323 Codec 输出功率过高导致喇叭烧毁

📖 精选 ✍️ 🌶 | 📅 2026-03-21 | 👍 0 | 原帖↗
#知识星球 #立芯嵌入式 #来源/立芯星球 #技术/Android #技术/音频调试 #质量/普通

原帖 | 🌶 | 2026-03-21 17:16 | 👍0 | 阅读约1

问题模型:ES8323 Codec 输出功率过高导致喇叭烧毁
项目背景
(Android 10)机型在最大音量播放时出现喇叭芯片烧毁的情况,需要将(Android 6)机型上已验证的降低音量方案移植到。核心需求是通过修改ES8323音频Codec芯片的寄存器配置,降低其输出功率,使喇叭在最大音量下的功率控制在安全范围内(目标约9.1W)。
问题分析定位
音频信号链路为:上层软件 → 内核Codec(ES8323) → 功放PA → 喇叭SPEAKER。Codec驱动负责数字音量控制,PA负责硬件放大。问题定位在Codec层输出过高,需要降低DAC增益和输出驱动能力。
实验设计
对比验证:使用git先确认(Android 6)与(Android 10)的Codec驱动差异,确认ES8323芯片型号一致
在线调试:使用I2C工具实时修改寄存器,配合电流测量(I²R法)确定目标功率对应的寄存器值
固化验证:将调试好的寄存器值写入驱动代码,编译烧录验证
实践步骤
阶段一:代码分析与移植

查看历史提交

git log --oneline --grep="reduce audio volume"
git log -p --grep="reduce audio volume" -n 4

关键发现:Android 6与Android 10驱动版本差异

- Android 6:封装了es8323_codec_default()函数

- Android 10:未封装,直接在probe()中执行初始化

修改文件:kernel/sound/soc/codecs/es8323.c
修改函数:es8323_probe() 和 es8323_resume()
关键寄存器:
0x30 / 0x31:DAC音量控制
0x1a / 0x1b:输出驱动增益
阶段二:在线调试(无需烧录)

读取当前寄存器值(烧录前)

i2cdump -y -f 2 0x10 //观察寄存器值
//设置寄存器值
i2cset -y -f 2 0x10 0x30 0x1b b && i2cset -y -f 2 0x10 0x31 0x1b b && i2cset -y -f 2 0x10 0x1a 0x00 b && i2cset -y -f 2 0x10 0x1b 0x00 b

电流测量结果:硬件工程师现场测量功率为12W

以此为基准值,设置:
i2cset -y -f 2 0x10 0x30 0x1b b && i2cset -y -f 2 0x10 0x31 0x1b b && i2cset -y -f 2 0x10 0x1a 0x06 b && i2cset -y -f 2 0x10 0x1b 0x06 b
测量得9.1W
问题梳理:
机型不同,硬件设计和功放并不相同,在不改动硬件增加硬件成本的情况下,需要软件调整来保底,我们实测发现使用i2cset 工具可以实时改动对应寄存器值从而控制功率大小,方便及时测试反馈问题进行调整,至于andrio版本带来的驱动代码不一致的问题我们只需要抓住重点,修改对应功能寄存器值来调整功率,就可以无视api函数带来的困扰,在probe函数和resume函数中实现我们想要的固件定制

311b8504076b.jpg


相关笔记